package com.xdclass.mapper;

import com.xdclass.model.TCoupon;
import com.xdclass.model.TCouponExample.Criteria;
import com.xdclass.model.TCouponExample.Criterion;
import com.xdclass.model.TCouponExample;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.jdbc.SQL;

public class TCouponSqlProvider {

  public String countByExample(TCouponExample example) {
    SQL sql = new SQL();
    sql.SELECT("count(*)").FROM("t_coupon");
    applyWhere(sql, example, false);
    return sql.toString();
  }

  public String deleteByExample(TCouponExample example) {
    SQL sql = new SQL();
    sql.DELETE_FROM("t_coupon");
    applyWhere(sql, example, false);
    return sql.toString();
  }

  public String insertSelective(TCoupon record) {
    SQL sql = new SQL();
    sql.INSERT_INTO("t_coupon");

    if (record.getCode() != null) {
      sql.VALUES("code", "#{code,jdbcType=VARCHAR}");
    }

    if (record.getPicUrl() != null) {
      sql.VALUES("pic_url", "#{picUrl,jdbcType=VARCHAR}");
    }

    if (record.getAchieveAmount() != null) {
      sql.VALUES("achieve_amount", "#{achieveAmount,jdbcType=INTEGER}");
    }

    if (record.getReduceAmount() != null) {
      sql.VALUES("reduce_amount", "#{reduceAmount,jdbcType=INTEGER}");
    }

    if (record.getStock() != null) {
      sql.VALUES("stock", "#{stock,jdbcType=INTEGER}");
    }

    if (record.getTitle() != null) {
      sql.VALUES("title", "#{title,jdbcType=VARCHAR}");
    }

    if (record.getStatus() != null) {
      sql.VALUES("status", "#{status,jdbcType=INTEGER}");
    }

    if (record.getCreateTime() != null) {
      sql.VALUES("create_time", "#{createTime,jdbcType=TIMESTAMP}");
    }

    return sql.toString();
  }

  public String selectByExample(TCouponExample example) {
    SQL sql = new SQL();
    if (example != null && example.isDistinct()) {
      sql.SELECT_DISTINCT("id");
    } else {
      sql.SELECT("id");
    }
    sql.SELECT("code");
    sql.SELECT("pic_url");
    sql.SELECT("achieve_amount");
    sql.SELECT("reduce_amount");
    sql.SELECT("stock");
    sql.SELECT("title");
    sql.SELECT("status");
    sql.SELECT("create_time");
    sql.FROM("t_coupon");
    applyWhere(sql, example, false);

    if (example != null && example.getOrderByClause() != null) {
      sql.ORDER_BY(example.getOrderByClause());
    }

    return sql.toString();
  }

  public String updateByExampleSelective(Map<String, Object> parameter) {
    TCoupon record = (TCoupon) parameter.get("record");
    TCouponExample example = (TCouponExample) parameter.get("example");

    SQL sql = new SQL();
    sql.UPDATE("t_coupon");

    if (record.getId() != null) {
      sql.SET("id = #{record.id,jdbcType=INTEGER}");
    }

    if (record.getCode() != null) {
      sql.SET("code = #{record.code,jdbcType=VARCHAR}");
    }

    if (record.getPicUrl() != null) {
      sql.SET("pic_url = #{record.picUrl,jdbcType=VARCHAR}");
    }

    if (record.getAchieveAmount() != null) {
      sql.SET("achieve_amount = #{record.achieveAmount,jdbcType=INTEGER}");
    }

    if (record.getReduceAmount() != null) {
      sql.SET("reduce_amount = #{record.reduceAmount,jdbcType=INTEGER}");
    }

    if (record.getStock() != null) {
      sql.SET("stock = #{record.stock,jdbcType=INTEGER}");
    }

    if (record.getTitle() != null) {
      sql.SET("title = #{record.title,jdbcType=VARCHAR}");
    }

    if (record.getStatus() != null) {
      sql.SET("status = #{record.status,jdbcType=INTEGER}");
    }

    if (record.getCreateTime() != null) {
      sql.SET("create_time = #{record.createTime,jdbcType=TIMESTAMP}");
    }

    applyWhere(sql, example, true);
    return sql.toString();
  }

  public String updateByExample(Map<String, Object> parameter) {
    SQL sql = new SQL();
    sql.UPDATE("t_coupon");

    sql.SET("id = #{record.id,jdbcType=INTEGER}");
    sql.SET("code = #{record.code,jdbcType=VARCHAR}");
    sql.SET("pic_url = #{record.picUrl,jdbcType=VARCHAR}");
    sql.SET("achieve_amount = #{record.achieveAmount,jdbcType=INTEGER}");
    sql.SET("reduce_amount = #{record.reduceAmount,jdbcType=INTEGER}");
    sql.SET("stock = #{record.stock,jdbcType=INTEGER}");
    sql.SET("title = #{record.title,jdbcType=VARCHAR}");
    sql.SET("status = #{record.status,jdbcType=INTEGER}");
    sql.SET("create_time = #{record.createTime,jdbcType=TIMESTAMP}");

    TCouponExample example = (TCouponExample) parameter.get("example");
    applyWhere(sql, example, true);
    return sql.toString();
  }

  public String updateByPrimaryKeySelective(TCoupon record) {
    SQL sql = new SQL();
    sql.UPDATE("t_coupon");

    if (record.getCode() != null) {
      sql.SET("code = #{code,jdbcType=VARCHAR}");
    }

    if (record.getPicUrl() != null) {
      sql.SET("pic_url = #{picUrl,jdbcType=VARCHAR}");
    }

    if (record.getAchieveAmount() != null) {
      sql.SET("achieve_amount = #{achieveAmount,jdbcType=INTEGER}");
    }

    if (record.getReduceAmount() != null) {
      sql.SET("reduce_amount = #{reduceAmount,jdbcType=INTEGER}");
    }

    if (record.getStock() != null) {
      sql.SET("stock = #{stock,jdbcType=INTEGER}");
    }

    if (record.getTitle() != null) {
      sql.SET("title = #{title,jdbcType=VARCHAR}");
    }

    if (record.getStatus() != null) {
      sql.SET("status = #{status,jdbcType=INTEGER}");
    }

    if (record.getCreateTime() != null) {
      sql.SET("create_time = #{createTime,jdbcType=TIMESTAMP}");
    }

    sql.WHERE("id = #{id,jdbcType=INTEGER}");

    return sql.toString();
  }

  protected void applyWhere(SQL sql, TCouponExample example, boolean includeExamplePhrase) {
    if (example == null) {
      return;
    }

    String parmPhrase1;
    String parmPhrase1_th;
    String parmPhrase2;
    String parmPhrase2_th;
    String parmPhrase3;
    String parmPhrase3_th;
    if (includeExamplePhrase) {
      parmPhrase1 = "%s #{example.oredCriteria[%d].allCriteria[%d].value}";
      parmPhrase1_th = "%s #{example.oredCriteria[%d].allCriteria[%d].value,typeHandler=%s}";
      parmPhrase2 = "%s #{example.oredCriteria[%d].allCriteria[%d].value} and #{example.oredCriteria[%d].criteria[%d].secondValue}";
      parmPhrase2_th = "%s #{example.oredCriteria[%d].allCriteria[%d].value,typeHandler=%s} and #{example.oredCriteria[%d].criteria[%d].secondValue,typeHandler=%s}";
      parmPhrase3 = "#{example.oredCriteria[%d].allCriteria[%d].value[%d]}";
      parmPhrase3_th = "#{example.oredCriteria[%d].allCriteria[%d].value[%d],typeHandler=%s}";
    } else {
      parmPhrase1 = "%s #{oredCriteria[%d].allCriteria[%d].value}";
      parmPhrase1_th = "%s #{oredCriteria[%d].allCriteria[%d].value,typeHandler=%s}";
      parmPhrase2 = "%s #{oredCriteria[%d].allCriteria[%d].value} and #{oredCriteria[%d].criteria[%d].secondValue}";
      parmPhrase2_th = "%s #{oredCriteria[%d].allCriteria[%d].value,typeHandler=%s} and #{oredCriteria[%d].criteria[%d].secondValue,typeHandler=%s}";
      parmPhrase3 = "#{oredCriteria[%d].allCriteria[%d].value[%d]}";
      parmPhrase3_th = "#{oredCriteria[%d].allCriteria[%d].value[%d],typeHandler=%s}";
    }

    StringBuilder sb = new StringBuilder();
    List<Criteria> oredCriteria = example.getOredCriteria();
    boolean firstCriteria = true;
    for (int i = 0; i < oredCriteria.size(); i++) {
      Criteria criteria = oredCriteria.get(i);
      if (criteria.isValid()) {
        if (firstCriteria) {
          firstCriteria = false;
        } else {
          sb.append(" or ");
        }

        sb.append('(');
        List<Criterion> criterions = criteria.getAllCriteria();
        boolean firstCriterion = true;
        for (int j = 0; j < criterions.size(); j++) {
          Criterion criterion = criterions.get(j);
          if (firstCriterion) {
            firstCriterion = false;
          } else {
            sb.append(" and ");
          }

          if (criterion.isNoValue()) {
            sb.append(criterion.getCondition());
          } else if (criterion.isSingleValue()) {
            if (criterion.getTypeHandler() == null) {
              sb.append(String.format(parmPhrase1, criterion.getCondition(), i, j));
            } else {
              sb.append(String.format(parmPhrase1_th, criterion.getCondition(), i, j,
                  criterion.getTypeHandler()));
            }
          } else if (criterion.isBetweenValue()) {
            if (criterion.getTypeHandler() == null) {
              sb.append(String.format(parmPhrase2, criterion.getCondition(), i, j, i, j));
            } else {
              sb.append(String.format(parmPhrase2_th, criterion.getCondition(), i, j,
                  criterion.getTypeHandler(), i, j, criterion.getTypeHandler()));
            }
          } else if (criterion.isListValue()) {
            sb.append(criterion.getCondition());
            sb.append(" (");
            List<?> listItems = (List<?>) criterion.getValue();
            boolean comma = false;
            for (int k = 0; k < listItems.size(); k++) {
              if (comma) {
                sb.append(", ");
              } else {
                comma = true;
              }
              if (criterion.getTypeHandler() == null) {
                sb.append(String.format(parmPhrase3, i, j, k));
              } else {
                sb.append(String.format(parmPhrase3_th, i, j, k, criterion.getTypeHandler()));
              }
            }
            sb.append(')');
          }
        }
        sb.append(')');
      }
    }

    if (sb.length() > 0) {
      sql.WHERE(sb.toString());
    }
  }
}
